package racine;

import java.io.*;
import java.text.*;
import java.util.*;
import donnees.*;
import admin.Initialisation;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServlet;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class consulterArchives extends HttpServlet {
 
    private Connection cnx;
    String path = "", loginBase, mdpBase, url, port;
    
    private void connexion() {
        connexion("");     
    }
    
    private void connexion(String base){
        cnx = null;
        if(path.equals("")){
            path = this.getServletContext().getRealPath("config");
            loginBase = this.getServletContext().getInitParameter("login");
            mdpBase = this.getServletContext().getInitParameter("password");
            url = this.getServletContext().getInitParameter("host");
            port = this.getServletContext().getInitParameter("port");
        }
        
        try {
            Class.forName("com.mysql.jdbc.Driver");

            cnx = DriverManager.getConnection("jdbc:mysql://"+url+":"+port+"/"+base, loginBase, mdpBase);
            //cnx = DriverManager.getConnection("jdbc:mysql://localhost:3306/saisieNotes", "saisieNotes", "PasssaisieNotes");


            System.out.println("connexion à la base réussie");
        } catch (Exception e) {
            System.out.println("connexion ratée : " + e);
            System.exit(1);
        }
    }
    
    public List<String> getAnnees(){
        List<String> st = new ArrayList<String>();
        try {
            Statement stmt = cnx.createStatement();
            ResultSet rs = stmt.executeQuery("SHOW DATABASES LIKE 'archivewebnotes%'"); 
            while ( rs.next() ) { 
                String r = rs.getString("Database (archivewebnotes%)");
                st.add(r); 
            }
            cnx.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return st;
    }
    
    
    
    public List<String> getPromos(){
        List<String> st = new ArrayList<String>();
        try {
            Statement stmt = cnx.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT DISTINCT annee FROM groupe ORDER BY annee ASC"); 
            while ( rs.next() ) { 
                String r = rs.getString(1);
                st.add(r); 
            }
            cnx.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return st;
    }
    
    public List<String> getGroupes(String promo){
        List<String> st = new ArrayList<String>();
        try {
            Statement stmt = cnx.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT DISTINCT nom FROM groupe WHERE annee="+promo+" ORDER BY nom ASC"); 
            while ( rs.next() ) { 
                String r = rs.getString(1);
                st.add(r); 
            }
            cnx.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return st;
    }
    
    public List<String> getMatieres(String promo){
        List<String> st = new ArrayList<String>();
        try {
            Statement stmt = cnx.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT DISTINCT nom FROM matiere WHERE annee="+promo+" ORDER BY nom ASC"); 
            while ( rs.next() ) { 
                String r = rs.getString(1);
                st.add(r); 
            }
            cnx.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return st;
    }
    
    public List<String> getControles(String matiere){
        List<String> st = new ArrayList<String>();
        try {
            Statement stmt = cnx.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT nom FROM epreuve WHERE id_matiere=(SELECT id FROM matiere WHERE nom=\""+matiere+"\")"); 
            while ( rs.next() ) { 
                String r = rs.getString(1);
                st.add(r); 
            }
            cnx.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return st;
    }
    
    public List<String> getNotes(String matiere, String controle, String classer, String asc){
        List<String> st = new ArrayList<String>();
        try {
            Statement stmt = cnx.createStatement();
            //Obtenons tout d'abord l'ID de l'épreuve...
            ResultSet id_epreuve = stmt.executeQuery("SELECT id FROM epreuve WHERE nom=\""+controle+"\" AND id_matiere=(SELECT id FROM matiere WHERE nom=\""+matiere+"\")"); 

            while ( id_epreuve.next() ) { 
                
                String r = id_epreuve.getString(1);
                //L'épreuve est-elle simple ou composée?
                ResultSet typeEpreuve = stmt.executeQuery("SELECT id FROM epreuvecomposee WHERE id="+r);
                String type = "";
                //C'est une épreuve composée, il faut donc piocher dans notepartie
                if (typeEpreuve.next()) type = "notepartie";
                //Sinon, c'est une épreuve simple, il faut piocher dans notesimple...
                else type = "notesimple";
                
                String classement = "";
                if(classer.equals("note")) classement = "n.note";
                else classement = "e."+classer;
                
                String ordre = "";
                if(asc.equals("yes")) ordre = "ASC";
                else ordre = "DESC";
                ResultSet notes = stmt.executeQuery("SELECT e.nom, e.prenom, e.groupe, e.demigroupe, n.note FROM "+type+" n, eleve e WHERE n.eleve=e.id AND n.epreuve="+r+" ORDER BY "+classement+" "+ordre);

                while(notes.next()){
                    String uneLigne = notes.getString(1)+"---"+notes.getString(2)+"---"+notes.getString(3)+"---"+notes.getString(4)+"---"+notes.getString(5);
                    st.add(uneLigne);
                }
                //st.add(r); 
            }
            cnx.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return st;
    }
    
    public List<String> getMoyennes(String matiere, String classer, String asc){
        List<String> st = new ArrayList<String>();
        try {
            Statement stmt = cnx.createStatement();
            //Obtenons tout d'abord l'ID de la matière...
            //ResultSet id_epreuve = stmt.executeQuery("SELECT id FROM matiere WHERE nom=\""+matiere+"\""); 

            //while ( id_epreuve.next() ) { 
                //String r = id_epreuve.getString(1);
                String classement = "";
                if(classer.equals("note")) classement = "c.correction";
                else classement = "e."+classer;
                
                String ordre = "";
                if(asc.equals("yes")) ordre = "ASC";
                else ordre = "DESC";
                ResultSet moy = stmt.executeQuery("SELECT e.nom, e.prenom, e.groupe, e.demigroupe, c.correction FROM eleve e, correctionmoyenne c WHERE c.eleve=e.id AND c.matiere=(SELECT id FROM matiere WHERE nom=\""+matiere+"\") ORDER BY "+classement+" "+ordre);

                while(moy.next()){
                    String uneLigne = moy.getString(1)+"---"+moy.getString(2)+"---"+moy.getString(3)+"---"+moy.getString(4)+"---"+moy.getString(5);
                    st.add(uneLigne);
                }
                //st.add(r); 
            //}
            cnx.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return st;
    }
    
    public void init(ServletConfig config) throws ServletException
    {
         super.init(config);
    }
    
	public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {
            connexion();
            PrintWriter out = response.getWriter();
            //response.setContentType( "text/xml" );
            //response.setHeader( "Cache-Control", "no-cache" );
            String action = request.getParameter("action");	
            if(action.equals("getBases")){
                
                   List<String> s = getAnnees();
                   String retour = "";
                   for(int i=0; i< s.size(); i++){
                       retour = retour + s.get(i).substring(15) + "/";
                   }
                   out.write(retour);
                
            }
            else if(action.equals("search")){
                connexion("archivewebnotes"+request.getParameter("annee"));
                List<String> s = null;
                //Seule l'année a été sélectionnée, il faut donc aller chercher les promos
                if((request.getParameter("promo")) == null){
                    s = getPromos();
                }
                //On en est à la sélection de la promo, donc il faut aller chercher les groupes...
                //else if((request.getParameter("groupe")) == null){
                //    s = getGroupes(request.getParameter("promo"));
                //}
                //On en est à la sélection du groupe, donc il faut aller chercher les matières...
                else if((request.getParameter("matiere")) == null){
                    s = getMatieres(request.getParameter("promo"));
                }
                //Si nous n'avons pas choisi de controle lors du submit, on doit aller chercher une moyenne
                else if((request.getParameter("moyennes")) != null){
                    //s = getMoyennes(request.getParameter("groupe"), request.getParameter("matiere"), request.getParameter("classement"), request.getParameter("asc"));
                    s = getMoyennes(request.getParameter("matiere"), request.getParameter("classement"), request.getParameter("asc"));

                }
                //On a sélectionné la matière, il faut aller chercher les controles...
                else if((request.getParameter("controle")) == null){
                    s = getControles(request.getParameter("matiere"));
                }
                //Si on arrive ici, c'est qu'on a rempli le formulaire. Allons chercher les notes!
                else if((request.getParameter("notes")) != null){
                    //s = getNotes(request.getParameter("groupe"), request.getParameter("matiere"), request.getParameter("controle"), request.getParameter("classement"), request.getParameter("asc"));
                    s = getNotes(request.getParameter("matiere"), request.getParameter("controle"), request.getParameter("classement"), request.getParameter("asc"));

                }
                //On ne devrait pas atteindre cet endroit...
                else System.out.println("Problème!");
                
                String retour = "";
                for(int i=0; i< s.size(); i++){
                   retour = retour + s.get(i) + "/";
                }
                out.write(retour);
            }
            else out.println("Problème!");
            
            out.close();
	}
 
	public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {
		doGet(request,response);
	}
}